﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

namespace MQTT.Demo.Test
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("欢迎来到MQTT!");

            try
            {
                Socket socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                socketClient.Connect("127.0.0.1", 1883);// 完成三次握手
                Console.WriteLine(">>> TCP连接通道已建立");
                {
                    // 模拟连接请求

                    // 组装请求连接的报文：
                    List<byte> bytes = new List<byte>();
                    ///
                    // 固定头
                    //bytes.Add(16);
                    //bytes.Add(31);

                    // 可变头
                    bytes.Add((byte)(4 / 256));
                    bytes.Add((byte)(4 % 256));
                    bytes.AddRange(Encoding.ASCII.GetBytes("MQTT"));
                    bytes.Add(4);

                    byte flag = 0; /// 0000 0000
                                   /// 1000 0000
                                   /// 0100 0000
                    // 添加用户名标记
                    flag = (byte)(flag | 128);
                    // 添加密码标记
                    flag = (byte)(flag | 64);
                    // 添加CleanSession标记
                    flag = (byte)(flag | 2);

                    bytes.Add(flag);

                    // 添加Keep Alive
                    bytes.Add((byte)(15 / 256));
                    bytes.Add((byte)(15 % 256));

                    // 载荷  0000 0001  0010 1100    300
                    bytes.Add((byte)(4 / 256));
                    bytes.Add((byte)(4 % 256));
                    // 内容字节  C002
                    bytes.AddRange(Encoding.ASCII.GetBytes("C002"));

                    // 用户名
                    bytes.Add((byte)(6 / 256));
                    bytes.Add((byte)(6 % 256));
                    bytes.AddRange(Encoding.ASCII.GetBytes("admin"));

                    // 密码
                    bytes.Add((byte)(6 / 256));
                    bytes.Add((byte)(6 % 256));
                    bytes.AddRange(Encoding.ASCII.GetBytes("123456"));

                    //Array.Copy()
                    byte[] len = new byte[] { (byte)bytes.Count };// 填充的可变报头+报文载荷的长度
                    bytes.Insert(0, ((byte)bytes.Count));// 第二个字节
                    bytes.Insert(0, ((byte)(1 << 4)));//  第一个字节
                    //using (MemoryStream memoryStream = new MemoryStream())
                    //{
                    //    // 0001 0000:    0000 0001     1100 0000
                    //    // 一直使用
                    //    memoryStream.WriteByte(1 << 4);// 添加固定头
                    //    memoryStream.Write(len, 0, len.Length);// 可变头+载荷长度
                    //    memoryStream.Write(bytes.ToArray(), 0, bytes.Count);

                    //    byte[] array = memoryStream.ToArray();
                    //    socketClient.Send(array, 0, array.Length, SocketFlags.None);
                    //}
                    socketClient.Send(bytes.ToArray(), 0, bytes.Count, SocketFlags.None);
                }

                // 判断连接成功
                {
                    byte[] result1 = new byte[1];
                    int len1 = socketClient.Receive(result1, 0, 1, SocketFlags.None);
                    var resp1 = result1[0];// 1、Header Flags
                    if (resp1 >> 4 == 2)
                    {
                        { Console.WriteLine(">>> 接收到请求响应报文"); }

                        byte[] result2 = new byte[1]; // 2、Msg Len
                        int len2 = socketClient.Receive(result2, 0, 1, SocketFlags.None);

                        byte[] result3 = new byte[result2[0]]; // 3、Return Code
                        int len3 = socketClient.Receive(result3, 0, result2[0], SocketFlags.None);
                        if (result3[1] == 0)
                        {
                            Console.WriteLine(">>> MQTT 连接成功！");
                            // 心跳  间断不停的发送
                            {
                                byte[] array = new byte[] { 12 << 4, 0 };
                                //using (MemoryStream memoryStream = new MemoryStream())
                                //{
                                //    memoryStream.WriteByte(12 << 4);// 添加固定头
                                //    memoryStream.Write(new byte[] { 0 }, 0, 1);// 可变头+载荷长度

                                //    array = memoryStream.ToArray();
                                //}
                                Task.Run(async () =>
                                {
                                    while (true)
                                    {
                                        await Task.Delay(2000);

                                        socketClient.Send(array, 0, array.Length, SocketFlags.None);
                                    }
                                });
                            }
                        }
                    }
                }

            // 订阅   发布
            // QoS的处理   VIP
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }

            Console.ReadLine();
        }
    }
}
